package com.vegetable.modules.service.allocation;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.vegetable.common.utils.R;
import com.vegetable.modules.entity.allocation.AllocationCollection;
import com.vegetable.modules.entity.allocation.po.AllocationCollectionAddPO;
import com.vegetable.modules.entity.allocation.po.AllocationCollectionQueryDTO;
import com.vegetable.modules.entity.allocation.po.CollectionDetailsQueryDTO;
import com.vegetable.modules.entity.allocation.po.DeductionStatisticsQueryDTO;
import com.vegetable.modules.entity.allocation.po.UpdateDeductionHandleOpinionWithDetailsPO;
import com.vegetable.modules.entity.allocation.vo.AllocationCollectionDetailWithSalesInfo;
import com.vegetable.modules.entity.allocation.vo.DeductionProcessResultVO;
import com.vegetable.modules.entity.allocation.vo.DeductionStatisticsVO;
import com.vegetable.modules.entity.allocation.vo.SalesOrderCollectionVO;

import java.util.List;

/**
 * <p>
 * 分配回款主表 服务类
 * </p>
 *
 * @author Qoder
 * @since 2025-10-08
 */
public interface IAllocationCollectionService extends IService<AllocationCollection> {

    /**
     * 分页查询分配回款列表
     * @param queryDTO 查询参数DTO
     * @return 分页结果
     */
    IPage<AllocationCollection> queryPage(AllocationCollectionQueryDTO queryDTO);

    /**
     * 保存分配回款
     * @param po 分配回款添加PO
     * @return 结果
     */
    R saveAllocationCollection(AllocationCollectionAddPO po) throws Exception;

    /**
     * 分配回款
     * @param po 分配回款添加PO
     * @return 结果
     */
    R allocatedCollection(AllocationCollectionAddPO po) throws Exception;

    /**
     * 根据ID查询分配回款详情
     * @param id 主键ID
     * @return 结果
     */
    R detailCollection(Long id);

    /**
     * 更新回款完成状态
     * @param id 回款记录ID
     * @param status 状态 0未完成，1已完成
     * @return 结果
     */
    R updateCollectionCompleteStatus(Long id, Integer status);

    /**
     * 删除分配回款
     * @param id 主键ID
     * @return 结果
     */
    R deleteCollection(Long id) throws Exception;


    /**
     * 统计扣款情况
     * @param queryDTO 查询参数DTO
     * @return 扣款统计列表
     */
    List<DeductionStatisticsVO> getDeductionStatistics(DeductionStatisticsQueryDTO queryDTO);

    /**
     * 根据条件查询回款情况
     * @param queryDTO 查询条件
     * @return 回款情况列表
     */
    List<SalesOrderCollectionVO> getCollectionDetailsByConditions(CollectionDetailsQueryDTO queryDTO);
    
    /**
     * 同时更新扣款处理状态和处理意见（包含明细）
     * @param po 更新扣款处理意见参数对象
     * @return 结果
     */
    R updateDeductionHandleStatusAndOpinionWithDetails(UpdateDeductionHandleOpinionWithDetailsPO po);
    
    /**
     * 根据销售出库单ID获取走货详情用于扣款处理
     * @param salesOutId 销售出库单ID
     * @return 扣款处理结果VO
     */
    DeductionProcessResultVO getShipmentDetailsForDeduction(Long salesOutId);

    List<AllocationCollectionDetailWithSalesInfo> findByOrderId(Long id);
}